package AOP.JDK;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author chenyuan
 * @date 2020/11/20 10:28
 */
public class JDKProxy {
    public static void main(String[] args) {
        Class[] clazz = {UserDao.class};
        /*
            创建接口实现类的代理对象
            参数：
            当前类的类加载器；
            需要增加的类的接口对象；
            调用处理 增强方法
         */
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), clazz, new UserDaoProxy(userDao));
        System.out.println(dao.add(1, 2));
    }
}
class UserDaoProxy implements InvocationHandler{
    // 通过有参构造，把需要增强的类传进来
    private Object object;
    public UserDaoProxy(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 方法执行 前 做的增强
        System.out.println("方法执行前 " + method.getName() + "， 参数："+ Arrays.toString(args));
        // 被增强的方法
        // 参数 ：被增强的对象（通过构造传进来的） ； 该方法需要的参数
        Object o = method.invoke(object, args);
        // 方法执行 后 做的增强
        System.out.println("方法执行后");
        return o;
    }
}